package TRSS

import (
	"fmt"
	"gopkg.in/yaml.v2"
	"strconv"
	"strings"
	"time"
	"github.com/olekukonko/tablewriter"
	"os"

)
//定义颜色常量
//定义路径
func getConfigPath(GoBoxPath,BotPath string) (string, error) {
    ConfigPath := []string{BotPath + "/plugins/QQGuild-Plugin/config.yaml", BotPath + "/config/QQGuild.yaml"}
    err := os.Chdir(GoBoxPath) //切换GoBox目录
    if err != nil {
        return "", err
    }
    for _, path := range ConfigPath {
		//判断是否存在，不存在跳过	
        if _, err := os.Stat(path); os.IsNotExist(err) {
            continue
        } else {
            configPath := path
            if _, err := os.Stat(configPath); os.IsNotExist(err) {
                return "", fmt.Errorf("请执行初始化选项确保对应的配置已经生成...")
            }
            return configPath, nil
        }
    }
    return "", fmt.Errorf("没有找到配置文件...")
}

// 账户添加
func TRSS_account_add(GoBoxPath,BotPath string) {
	var (
		sandbox int
		domain int
		Appid string
		Token string
		
	
	)
	os.Chdir(GoBoxPath)
	configPath, err := getConfigPath(GoBoxPath,BotPath)
	if err != nil {
		fmt.Println(Red,"获取配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		// return
	}
	//判断是否已经初始化
	BotPathconfigPath := BotPath + "/config/config/bot.yaml" //判断是否已经初始化
	if _, err := os.Stat(BotPathconfigPath); os.IsNotExist(err) {
		fmt.Println(Red,"请执行初始化选项确保对应的配置已经生成...", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	//判断是否存在，不存在则返回
	//打印当前目录
	fmt.Println("配置文件:", configPath)
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		// 询问是否生成配置文件
		fmt.Printf("QQGuild-Plugin配置文件不存在,是否生成?(y/n):")
		var input string
		fmt.Scanln(&input)
		if input == "y" || input == "Y" {
			//配置结构体的默认值
			config := token {
				Tips: []string{"该配置由GoBox自动生成","欢迎使用 TRSS-Yunzai QQGuild Plugin ! 作者：时雨🌌星空", "参考：https://github.com/TimeRainStarSky/Yunzai-QQGuild-Plugin"},
				permission: []string{"master"},
				Token:      []string{},
			}
			//转成yaml格式，保留注释并保存
			d, err := yaml.Marshal(&config)
			if err != nil {
				fmt.Println(Red,"转换yaml格式失败", err, Reset)
				time.Sleep(2 * time.Second)
				return
			}
			modifiedYAMLData := addSpaceBeforeHyphen(string(d)) //连字符前面加空格
			//创建文件并写入
			configPath := BotPath + "/plugins/QQGuild-Plugin/config.yaml"
			os.Create(configPath)
			err = writeFile (configPath, modifiedYAMLData)
			if err != nil {
				fmt.Println(Red,"保存配置文件失败", err, Reset)
				time.Sleep(2 * time.Second)
				return
			}
			fmt.Println(Green,"生成成功...", Reset)
			time.Sleep(2 * time.Second)
			return
		} else {
			fmt.Println(Red,"取消生成...", Reset)
			time.Sleep(2 * time.Second)
			return
		}
				

	}
	data, err := readFile(configPath)
	if err != nil {
		//红色字体
		fmt.Println(Red, "读取配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
	}
	var config token
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		fmt.Println(Red,"解析配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
	}
	//保存配置文件
	fmt.Printf("配置沙盒(0.关闭 1.开启):")
	fmt.Scanln(&sandbox)
	//校验输入，只能输入0或1
	if sandbox != 0 && sandbox != 1 {
		fmt.Println(Red, "输入错误", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	fmt.Printf("配置域(0.公域 1.私域):")
	fmt.Scanln(&domain)
	//校验输入，只能输入0或1
	if domain != 0 && domain != 1 {
		fmt.Println(Red, "输入错误", Reset)
		return
	}
	fmt.Printf("配置Appid:")
	fmt.Scanln(&Appid)
	//校验输入，整数最大12为
	//判断是否为整数
	AppidInt, err := strconv.Atoi(Appid)
	if err != nil {
		fmt.Println(Red, "Appid账户输入错误,请输入整数", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	if AppidInt <= 6 || AppidInt > 999999999999 {
		fmt.Println(Red, "Appid账户输入错误", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	fmt.Printf("配置token:")
	fmt.Scanln(&Token)
	str := fmt.Sprintf("%d:%d:%d:%v", sandbox,domain, AppidInt, Token)
	str = strings.Replace(str, " ", "", -1)
	//判断是否存在
	//存在则修改
	//不存在则添加
	//保存配置文件
	for i := 0; i < len(config.Token); i++ {
		appid := strings.Split(config.Token[i], ":")[2]
		if appid == Appid {
			fmt.Println(Yellow,"添加失败,Appid账户已存在如需修改请选择2", Reset)
			time.Sleep(2 * time.Second)
			return
		}
	}
	//da
	config.Token = append(config.Token, str)
	//转成yaml格式，保留注释并保存
	d, err := yaml.Marshal(&config)
	if err != nil {
		fmt.Println(Red, "转换yaml格式失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	modifiedYAMLData := addSpaceBeforeHyphen(string(d))
	err = writeFile (configPath, modifiedYAMLData)
	if err != nil {
		fmt.Println(Red, "保存配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	fmt.Println(Green, "添加成功...", Reset)
	time.Sleep(2 * time.Second)
	return
}

// 账户修改
func TRSS_account_modify(GoBoxPath,BotPath string ) {
	var (
		Appid string
		sandbox int
		domain int
		Token string
	)

	os.Chdir(GoBoxPath)
	configPath, err := getConfigPath(GoBoxPath,BotPath)
	if err != nil {
		fmt.Println(Red,"获取配置文件失败", err, Reset)
		// time.Sleep(2 * time.Second)
		return 
	}
	//判断是否存在，不存在则返回
	//打印当前目录
	fmt.Println("配置文件:", configPath)
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		fmt.Println(Red,"QQGuild-Plugin配置文件不存在,请选择1生成...", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	// data, err := ioutil.ReadFile(configPath)
	data, err := readFile(configPath)
	if err != nil {
		fmt.Println(Red, "读取配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	var config token
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		fmt.Println(Red, "解析配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	//输入要修改的Appid账户
	fmt.Printf("请输入要修改的Appid账户:")
	fmt.Scanln(&Appid)
	//校验输入，整数最大12为
	//判断是否为整数
	AppidInt, err := strconv.Atoi(Appid)
	if err != nil {
		fmt.Println(Red,"Appid账户输入错误,请输入整数", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	if AppidInt <= 6 || AppidInt > 999999999999 {
		fmt.Println(Red,"Appid账户输入错误", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	//查找要修改的配置项
	for i := 0; i < len(config.Token); i++ {
		appid := strings.Split(config.Token[i], ":")[2]
		if appid == Appid {
			//重新输入其他三个变量的值
			fmt.Printf("配置沙盒(0.关闭 1.开启):")
			fmt.Scanln(&sandbox)
			//校验输入，只能输入0或1
			if sandbox != 0 && sandbox != 1 {
				fmt.Println(Red,"输入错误", Reset)
				time.Sleep(2 * time.Second)
				return

			}
			fmt.Printf("配置域(0.公域 1.私域):")
			fmt.Scanln(&domain)
			//校验输入，只能输入0或1
			if domain != 0 && domain != 1 {
				fmt.Println(Red,"输入错误", Reset)
				time.Sleep(2 * time.Second)
				return
			}
			fmt.Printf("配置token:")
			fmt.Scanln(&Token)
			//校验输入，字符50位
			//拼接字符串，中间:区分
			str := fmt.Sprintf("%d:%d:%d:%v", sandbox,domain, AppidInt, Token)
			str = strings.Replace(str, " ", "", -1)
			//更新配置项
			config.Token[i] = str
			//转成yaml格式，保留注释并保存
			d, err := yaml.Marshal(&config)
			if err != nil {
				fmt.Println(Red,"转换yaml格式失败", err, Reset)
				time.Sleep(2 * time.Second)
				return
			}
			//连字符前面加空格
			modifiedYAMLData := addSpaceBeforeHyphen(string(d))
			err = writeFile (configPath, modifiedYAMLData)
			if err != nil {
				fmt.Println(Red,"保存配置文件失败", err, Reset)
				time.Sleep(2 * time.Second)
				return
			}
			fmt.Println(Green,"修改成功...", Reset)
			time.Sleep(2 * time.Second)
			return
		}
	}
	fmt.Println(Red,"要修改的Appid账户不存在", Reset)
	time.Sleep(2 * time.Second)
}


func TRSS_account_delete(GoBoxPath,BotPath string ) {
	var (
		Appid string
		found bool
	)

	// 读取配置文件
	os.Chdir(GoBoxPath)
	configPath, err := getConfigPath(GoBoxPath,BotPath)
	if err != nil {
		fmt.Println(Red,"获取配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	//判断是否存在，不存在则返回
	//打印当前目录
	fmt.Println("配置文件:", configPath)
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		fmt.Println(Red,"QQGuild-Plugin配置文件不存在,请选择1生成...", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	data, err := readFile(configPath)
	if err != nil {
		fmt.Println(Red,"读取配置文件失败", err, Reset)
		return
	}
	var config token
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		fmt.Println(Red,"解析配置文件失败", err, Reset)
		return
	}

	// 提示用户输入要删除的 Appid
	fmt.Printf("请输入要删除的Appid账户:")
	fmt.Scanln(&Appid)

	// 验证 Appid 输入
	AppidInt, err := strconv.Atoi(Appid)
	if err != nil {
		fmt.Println(Red,"Appid账户输入错误,请输入整数", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	if AppidInt <= 6 || AppidInt > 999999999999 {
		fmt.Println(Red,"Appid账户输入错误", Reset)
		time.Sleep(2 * time.Second)
		return
	}

	// 在配置文件中查找 Appid
	for i := 0; i < len(config.Token); i++ {
		appid := strings.Split(config.Token[i], ":")[2]
		if appid == Appid {
			// 找到 Appid，从切片中删除它
			found = true
			config.Token = append(config.Token[:i], config.Token[i+1:]...)
			break
		}
	}
	if !found {
		// 没有找到 Appid
		fmt.Println(Red,"要删除的Appid账户不存在", Reset)
		time.Sleep(2 * time.Second)
		return
	}

	// 检查是否至少有一个帐户配置剩余
	if len(config.Token) == 0 {
		fmt.Println(Red, "要确保正常运行,最少保留1个账户,如需修改选择3", Reset)
		time.Sleep(2 * time.Second)
		return
	}

	// 保存更新后的配置文件
	d, err := yaml.Marshal(&config)
	if err != nil {
		fmt.Println(Red,"转换yaml格式失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	modifiedYAMLData := addSpaceBeforeHyphen(string(d))
	err = writeFile (configPath, modifiedYAMLData)
	if err != nil {
		fmt.Println(Red,"保存配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	fmt.Println(Green,"删除成功...", Reset)
	time.Sleep(2 * time.Second)
}
func TRSS_account_view(GoBoxPath,BotPath string) {

	os.Chdir(GoBoxPath)
	configPath, err := getConfigPath(GoBoxPath,BotPath)
	if err != nil {
		fmt.Println(Red,"获取配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	//判断是否存在，不存在则返回
	//打印当前目录
	fmt.Println("配置文件:", configPath)
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		fmt.Println(Red,"QQGuild-Plugin配置文件不存在,请选择1生成...", Reset)
		time.Sleep(2 * time.Second)
		return
	}
	data, err := readFile(configPath)
	if err != nil {
		fmt.Println(Red,"读取配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	var config token
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		fmt.Println(Red,"解析配置文件失败", err, Reset)
		time.Sleep(2 * time.Second)
		return
	}
	if len(config.Token) == 0 {
		fmt.Println(Red,"没有配置账户...", Reset)
		time.Sleep(2 * time.Second)
		return
	}

	// 创建表格对象
	table := tablewriter.NewWriter(os.Stdout)
	// 设置表格标题
	table.SetHeader([]string{"Appid", "沙盒", "域", "Token"})
	// 设置表格的列宽度为20
	table.SetColWidth(20)
	
	// 添加数据到表格中
	for _, t := range config.Token {
		fields := strings.Split(t, ":")
		if len(fields) == 4 {
			Appid := fields[2]
			sandbox, _ := strconv.Atoi(fields[0])
			domain, _ := strconv.Atoi(fields[1])
			token := fields[3]
			// 对输出进行优化
			var sandboxStr string
			if sandbox == 0 {
				sandboxStr = "关闭"
			} else {
				sandboxStr = "开启"
			}
			var domainStr string
			if domain == 0 {
				domainStr = "公域"
			} else {
				domainStr = "私域"
			}
			table.Append([]string{Appid, sandboxStr, domainStr, token})
		}
	}

	// 渲染表格
	table.Render()

	//按任意键继续
	fmt.Printf("按回车键继续...")
	fmt.Scanln()
}